package ioc
// 可撤销的int集合
type IntSet2 struct {
	data map[int]bool
	undo Undo
}

func NewIntSet2() IntSet2 {
	return IntSet2{data: make(map[int]bool)}
}

//
func (set *IntSet2) Undo() error {
	return set.undo.Undo()
}

func (set *IntSet2) Contains(x int) bool {
	return set.data[x]
}

// 新增
// 不存在元素时：添加元素，并新增撤销函数（删除元素）
// 存在元素时，不做任何操作，，并新增撤销函数（空）
func (set *IntSet2)Add(x int)  {
	if !set.Contains(x) {
		set.data[x]=true
		set.undo.Add(func() {
			set.Delete(x)
		})
	}else {
		set.undo.Add(nil)
	}
}

// 删除，与新增相反
// 存在元素时：删除元素，并新增撤销函数（新增元素）
// 不存在元素时，不做任何操作，并新增撤销函数（空）
func (set *IntSet2)Delete(x int)  {
	if set.Contains(x) {
		delete(set.data,x)
		set.undo.Add(func() {
			set.Add(x)
		})
	}else{
		set.undo.Add(nil)
	}
}